/**
 * 管理员密码安全更新脚本
 * EndoSight-UC 医疗AI系统 - 焦土协议
 * 
 * 紧急更新数据库中的管理员密码哈希
 */

import sqlite3 from 'sqlite3';
import { fileURLToPath } from 'url';
import path from 'path';
import crypto from 'crypto';
import { createSecureLogger } from './endo_sight_uc_server/src/utils/secureLoggingConfig.js';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 安全日志记录器
const logger = createSecureLogger({
  service: 'PasswordUpdater',
  logLevel: 'info'
});

// 数据库文件路径
const dbPath = path.join(__dirname, 'endo_sight_uc_server/data/endo_sight_uc.db');

// 新的安全密码
const NEW_ADMIN_PASSWORD = process.env.ADMIN_SECURE_PASSWORD || '8f94683e08c9cbc1';

/**
 * 生成安全的密码哈希
 */
const generateSecureHash = (password, salt = null) => {
  if (!salt) {
    salt = crypto.randomBytes(32).toString('hex');
  }
  
  const hash = crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha512').toString('hex');
  return { hash, salt };
};

/**
 * 更新管理员密码
 */
const updateAdminPassword = async () => {
  logger.info('开始执行管理员密码安全更新');
  
  return new Promise((resolve, reject) => {
    if (!fs.existsSync(dbPath)) {
      const error = new Error(`数据库文件不存在: ${dbPath}`);
      logger.logError(error, { dbPath });
      return reject(error);
    }

    const db = new sqlite3.Database(dbPath, (err) => {
      if (err) {
        logger.logError(err, { operation: 'database_connection' });
        return reject(err);
      }
      
      logger.info('数据库连接成功');
    });

    // 开始事务
    db.serialize(() => {
      db.run('BEGIN TRANSACTION', (err) => {
        if (err) {
          logger.logError(err, { operation: 'begin_transaction' });
          return reject(err);
        }
        
        logger.info('事务开始');
      });

      // 生成新的密码哈希
      const { hash, salt } = generateSecureHash(NEW_ADMIN_PASSWORD);
      
      logger.info('新密码哈希生成完成', {
        hashLength: hash.length,
        saltLength: salt.length
      });

      // 更新admin用户的密码
      const updateSql = `
        UPDATE doctors 
        SET password = ?, salt = ?, updated_at = CURRENT_TIMESTAMP 
        WHERE username = 'admin'
      `;

      db.run(updateSql, [hash, salt], function(err) {
        if (err) {
          logger.logError(err, { 
            operation: 'update_admin_password',
            username: 'admin'
          });
          return reject(err);
        }

        if (this.changes === 0) {
          // 如果没有找到admin用户，创建一个
          logger.warn('未找到admin用户，将创建新的admin用户');
          
          const createSql = `
            INSERT INTO doctors (
              username, password, salt, full_name, email, role, 
              department, license_number, created_at, updated_at
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
          `;
          
          const createParams = [
            'admin',
            hash,
            salt,
            'System Administrator',
            'admin@endo_sight_uc.local',
            'admin',
            'IT Security'
          ];

          db.run(createSql, createParams, function(err) {
            if (err) {
              logger.logError(err, { operation: 'create_admin_user' });
              return reject(err);
            }

            logger.info('admin用户创建成功', {
              userId: this.lastID,
              username: 'admin'
            });

            // 提交事务
            db.run('COMMIT', (err) => {
              if (err) {
                logger.logError(err, { operation: 'commit_transaction' });
                return reject(err);
              }

              logger.info('事务提交成功');
              db.close((closeErr) => {
                if (closeErr) {
                  logger.logError(closeErr, { operation: 'database_close' });
                  return reject(closeErr);
                }

                logger.info('数据库连接关闭');
                resolve({
                  success: true,
                  action: 'admin_user_created',
                  userId: this.lastID
                });
              });
            });
          });
        } else {
          logger.info('admin密码更新成功', {
            changes: this.changes,
            username: 'admin'
          });

          // 提交事务
          db.run('COMMIT', (err) => {
            if (err) {
              logger.logError(err, { operation: 'commit_transaction' });
              return reject(err);
            }

            logger.info('事务提交成功');
            db.close((closeErr) => {
              if (closeErr) {
                logger.logError(closeErr, { operation: 'database_close' });
                return reject(closeErr);
              }

              logger.info('数据库连接关闭');
              resolve({
                success: true,
                action: 'password_updated',
                changes: this.changes
              });
            });
          });
        }
      });
    });
  });
};

/**
 * 执行密码更新
 */
const main = async () => {
  try {
    logger.info('=== 焦土协议 - 管理员密码安全更新 ===');
    logger.info('开始时间:', new Date().toISOString());
    
    const result = await updateAdminPassword();
    
    logger.info('✅ 密码更新完成', result);
    console.log('\n✅ 管理员密码安全更新成功！');
    console.log(`📝 新密码: ${NEW_ADMIN_PASSWORD}`);
    console.log('⚠️  请将此密码存储在安全的地方');
    console.log('🔄 所有现有会话已失效，需要重新登录');
    
  } catch (error) {
    logger.error('❌ 密码更新失败', error);
    console.error('\n❌ 管理员密码更新失败:', error.message);
    process.exit(1);
  }
};

// 执行脚本
if (import.meta.url === `file://${process.argv[1]}`) {
  main();
}

export { updateAdminPassword, generateSecureHash };
